package org.iamd.util;

import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.iamd.domain.IWorker;

/**
 * Клас, който осигурява методи за поставяне и извличане на обекти в Request-a и
 * сесията на потребителя.
 * 
 * @author И. Атанасов
 */
public final class RequestManager {

	/**
	 * @return текущата HTTP сесия. Ако няма такава - създава нова. Връща
	 *         <code>null</code> ако текущия {@link FacesContext} е
	 *         <code>null</code>.
	 */
	public static HttpSession getCurrentSession() {
		FacesContext context = FacesContext.getCurrentInstance();
		return context != null ? (HttpSession) context.getExternalContext().getSession(true) : null;
	}

	/**
	 * Зарежда от request-а текущия БО.
	 * 
	 * @param clazz
	 *            Класа на обекта, който трябва да се извлече
	 * 
	 * @return IWorker резултата
	 */
	public static IWorker getFromRequest(Class<? extends IWorker> clazz) {
		FacesContext context = FacesContext.getCurrentInstance();
		if (context != null) {
			return (IWorker) ((HttpServletRequest) context.getExternalContext().getRequest())
					.getAttribute(clazz.getName());
		}
		return null;
	}

	/**
	 * Връща cast-нат атрибут от сесията.
	 * 
	 * @param <T>
	 *            тип на атрибута към който се cast-ва
	 * @param attr
	 *            име на атрибут
	 * @param clazz
	 *            клас на атрибута
	 * 
	 * @return намерения и cast-нат атрибут
	 */
	public static <T extends Object> T getSessionAttr(String attr, Class<T> clazz) {
		FacesContext context = FacesContext.getCurrentInstance();
		if (context != null) {
			HttpSession sess = (HttpSession) context.getExternalContext().getSession(true);
			return clazz.cast(sess.getAttribute(attr));
		}
		return null;
	}

	/**
	 * Поставя в request-а посочен бизнес обект.
	 * 
	 * @param clazz
	 *            класа на обекта, който трябва да се съхрани в request-а
	 * @param bw
	 *            бизнес обекта
	 */
	public static void putInRequest(Class<? extends IWorker> clazz, IWorker bw) {
		FacesContext context = FacesContext.getCurrentInstance();
		if (context != null) {
			((HttpServletRequest) context.getExternalContext().getRequest()).setAttribute(
					clazz.getName(), bw);
		}
	}

	/**
	 * Изчиства от request-а споделени пропъртита.
	 * 
	 * @param props
	 *            пропъртито, което трябва да се изчисти
	 */
	public static void removeManagedPropertyFromRequest(IManagedProps props) {
		FacesContext context = FacesContext.getCurrentInstance();
		if (context != null) {
			((HttpServletRequest) context.getExternalContext().getRequest()).removeAttribute(props
					.getPropName());
		}
	}

	/**
	 * Слага атрибут в потребителската сесия. Ако стойността стойността е
	 * <code>null</code> - премахва атрибут от сесията.
	 * 
	 * @param attr
	 *            име на атрибута
	 * @param value
	 *            стойност
	 */
	public static void setSessionAttr(String attr, Object value) {
		FacesContext context = FacesContext.getCurrentInstance();
		if (context != null) {
			HttpSession sess = (HttpSession) context.getExternalContext().getSession(true);
			if (value != null) {
				sess.setAttribute(attr, value);
			} else {
				sess.removeAttribute(attr);
			}
		}
	}

}